package com.chukun.concurrency.syncCollecton;

import com.chukun.concurrency.annotations.UnThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.Iterator;
import java.util.Vector;

/**
 * 线程安全类 vector的基本使用
 * 也会出现线程安全的问题
 */
@Slf4j
@UnThreadSafe
public class VectorUnThreadSafeOperator {

    /**
     * 报错:java.util.ConcurrentModificationException
     * 解决方法：在遍历的同时，对删除元素做标记，遍历完成之后再删除
     * @param v1
     */
    public static void test1(Vector<Integer> v1){ //for each
        for(Integer i:v1){
            if(i.equals(3)){
                v1.remove(i);
            }
        }
    }

    /**
     *java.util.ConcurrentModificationException
     * 解决方法：在遍历的同时，对删除元素做标记，遍历完成之后再删除
     * @param v1
     */
    public static void test2(Vector<Integer> v1){//迭代器 iterator
        Iterator<Integer> iterator = v1.iterator();
        while(iterator.hasNext()){
            Integer i = iterator.next();
            if(i.equals(3)){
                v1.remove(i);
            }
        }
    }

    /**
     * 正常执行，无报错
     * @param v1
     */
    public static void test3(Vector<Integer> v1){
        for(int i=0;i<v1.size();i++){ //普通for循环
            if(v1.get(i).equals(3)){
                v1.remove(i);
            }
        }
    }
    public static void main(String[] args) {
        Vector<Integer> vector=new Vector<>();
        vector.add(1);
        vector.add(2);
        vector.add(3);
//        test1(vector);
//        test2(vector);
//        test3(vector);
    }
}
